home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / Apple Game Sprockets / Examples / DroneZone / DZUtils.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-16  |  3.5 KB  |  192 lines  |  [TEXT/CWIE]

  1. /*
  2.  *    File:        DZUtils.c
  3.  *    Author:        Dan Venolia
  4.  *
  5.  *    Copyright © 1996 Apple Computer, Inc.
  6.  */
  7.  
  8. #include <assert.h>
  9.  
  10. #include <Resources.h>
  11. #include <Types.h>
  12.  
  13. #include <QD3D.h>
  14. #include <QD3DGroup.h>
  15. #include <QD3DIO.h>
  16. #include <QD3DStorage.h>
  17.  
  18. #include "DZUtils.h"
  19.  
  20.  
  21. /*******************************************************************************
  22.  *    CheckVersionNumber
  23.  *
  24.  *    Returns true if the given version number is compatible with (i. e not older
  25.  *    than) version inMajor.inMinor.inBug.
  26.  ******************************************************************************/
  27. Boolean CheckVersionNumber(
  28.     const NumVersion*        inVersion,
  29.     UInt8                    inMajor,
  30.     UInt8                    inMinor,
  31.     UInt8                    inBug)
  32. {
  33.     if (inVersion->majorRev != inMajor)
  34.     {
  35.         return inVersion->majorRev > inMajor;
  36.     }
  37.     else
  38.     {
  39.         return inVersion->minorAndBugRev >= inMinor << 4 | inBug;
  40.     }
  41. }
  42.  
  43.  
  44. /* =============================================================================
  45.  *        Get3DMFResource (external)
  46.  *
  47.  *    Gets the '3DMF' resource with the given ID, and reads it using QD3D, and
  48.  *    returns a reference to anything drawable in it.  NULL is returned if a
  49.  *    problem occurs.
  50.  * ========================================================================== */
  51. TQ3Object Get3DMFResource(
  52.     short                inResourceID)
  53. {
  54.     Handle                resource;
  55.     TQ3Object            result;
  56.     TQ3Object            object;
  57.     TQ3Object            group;
  58.     TQ3StorageObject    storage;
  59.     TQ3FileObject        file;
  60.     TQ3FileMode            mode;
  61.     
  62.     resource    = NULL;
  63.     result        = NULL;
  64.     object        = NULL;
  65.     group        = NULL;
  66.     storage        = NULL;
  67.     file        = NULL;
  68.     
  69.     // Grab the resource
  70.     resource = GetResource('3DMF', inResourceID);
  71.     if (resource == NULL || ResError() != noErr)  goto bail;
  72.     
  73.     // Set up for reading
  74.     storage = Q3HandleStorage_New(resource, GetHandleSize(resource));
  75.     if (storage == NULL)  goto bail;
  76.     
  77.     file = Q3File_New();
  78.     if (file == NULL)  goto bail;
  79.     
  80.     if (Q3File_SetStorage(file, storage) != kQ3Success)  goto bail;
  81.     
  82.     if (Q3File_OpenRead(file, &mode) != kQ3Success)  goto bail;
  83.     
  84.     // Read the objects
  85.     group = NULL;
  86.     
  87.     while (!Q3File_IsEndOfFile(file))
  88.     {
  89.         object = Q3File_ReadObject(file);
  90.         if (object != NULL)
  91.         {
  92.             if (Q3Object_IsDrawable(object))
  93.             {
  94.                 if (result == NULL)
  95.                 {
  96.                     // This is the first object
  97.                     result = Q3Shared_GetReference(object);
  98.                 }
  99.                 else
  100.                 {
  101.                     // Make sure we have a group to add it to
  102.                     if (group == NULL)
  103.                     {
  104.                         // Create the new group
  105.                         group = Q3DisplayGroup_New();
  106.                         Q3Group_AddObject(group, result);
  107.                         
  108.                         Q3Object_Dispose(result);
  109.                         result = Q3Shared_GetReference(group);
  110.                     }
  111.                     
  112.                     // Add it to the group
  113.                     assert(group == result);
  114.                     Q3Group_AddObject(result, object);
  115.                 }
  116.             }
  117.             
  118.             Q3Object_Dispose(object);
  119.             object = NULL;
  120.         }
  121.     }
  122.     
  123.     // Get rid of the group reference
  124.     if (group != NULL)
  125.     {
  126.         Q3Object_Dispose(group);
  127.         group = NULL;
  128.     }
  129.     
  130.     // Finish reading
  131.     Q3File_Close(file);
  132.     
  133.     Q3Object_Dispose(file);
  134.     file = NULL;
  135.     
  136.     Q3Object_Dispose(storage);
  137.     storage = NULL;
  138.     
  139.     // Release the resource
  140.     ReleaseResource(resource);
  141.     
  142.     return result;
  143.     
  144.     // Error exit
  145.     bail:
  146.     
  147.     if (resource != NULL)
  148.     {
  149.         ReleaseResource(resource);
  150.         resource = NULL;
  151.     }
  152.     
  153.     if (result != NULL)
  154.     {
  155.         Q3Object_Dispose(result);
  156.         result = NULL;
  157.     }
  158.     
  159.     if (object != NULL)
  160.     {
  161.         Q3Object_Dispose(object);
  162.         object = NULL;
  163.     }
  164.     
  165.     if (group != NULL)
  166.     {
  167.         Q3Object_Dispose(group);
  168.         group = NULL;
  169.     }
  170.     
  171.     if (result != NULL)
  172.     {
  173.         Q3Object_Dispose(result);
  174.         result = NULL;
  175.     }
  176.     
  177.     if (storage != NULL)
  178.     {
  179.         Q3Object_Dispose(storage);
  180.         storage = NULL;
  181.     }
  182.     
  183.     if (file != NULL)
  184.     {
  185.         Q3Object_Dispose(file);
  186.         file = NULL;
  187.     }
  188.     
  189.     return NULL;
  190. }
  191.  
  192.